define(function (require, exports, module) {
    Math.easeInOutQuad = function (t, b, c, d) {
        t /= d / 2
        if (t < 1) {
            return c / 2 * t * t + b
        }
        t--
        return -c / 2 * (t * (t - 2) - 1) + b
    }

// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts
    var requestAnimFrame = (function () {
        return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function (callback) {
            window.setTimeout(callback, 1000 / 60)
        }
    })()

    /**
     * Because it's so fucking difficult to detect the scrolling element, just move them all
     * @param {number} amount
     */
    function move(amount) {
        document.documentElement.scrollTop = amount
        document.body.parentNode.scrollTop = amount
        document.body.scrollTop = amount
    }

    function position() {
        return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop
    }

    /**
     * @param {number} to
     * @param {number} duration
     * @param {Function} callback
     */
    function scrollTo(to, duration, callback) {
        const start = position()
        const change = to - start
        const increment = 20
        let currentTime = 0
        duration = (typeof (duration) === 'undefined') ? 500 : duration
        var animateScroll = function () {
            // increment the time
            currentTime += increment
            // find the value with the quadratic in-out easing function
            var val = Math.easeInOutQuad(currentTime, start, change, duration)
            // move the document.body
            move(val)
            // do the animation unless its over
            if (currentTime < duration) {
                requestAnimFrame(animateScroll)
            } else {
                if (callback && typeof (callback) === 'function') {
                    // the animation is done so lets callback
                    callback()
                }
            }
        }
        animateScroll()
    }

    module.exports = {
        scrollTo
    };
})
